# -*- coding: utf-8 -*-
"""
博客应用主文件
"""
from flask import Flask
from flask_cors import CORS
from app.controllers.auth_controller import auth_bp
from app.controllers.article_controller import article_bp
from app.controllers.category_controller import category_bp
from app.controllers.study_controller import study_bp
from app.controllers.upload_controller import upload_bp
from app.config.database import init_db
from app.utils.response import success_response

def create_app():
    """
    创建Flask应用实例
    目的：初始化并配置Flask应用，实现应用工厂模式
    功能：配置跨域、注册蓝图、初始化数据库和设置应用级配置
    """
    app = Flask(__name__)

    # 配置应用
    app.config['SECRET_KEY'] = 'your-secret-key-here'  # 生产环境应该使用环境变量
    app.config['JSON_AS_ASCII'] = False  # 支持中文JSON响应
    app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024  # 上传文件大小限制10MB

    # 配置跨域，允许前端跨域访问
    # 目的：解决前后端分离项目的跨域问题，确保前端可以正常调用后端API
    CORS(app,
         resources={r"/api/*": {"origins": "*"}},  # 允许所有API路径跨域访问
         supports_credentials=True,  # 支持携带Cookie和认证信息
         allow_headers=["Content-Type", "Authorization"],  # 允许的请求头
         methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"]  # 允许的HTTP方法
    )

    # 注册蓝图
    # 认证相关路由，处理用户登录、登出、个人信息查询等功能
    app.register_blueprint(auth_bp)
    # 文章相关路由，处理文章发布、查询、分类管理等功能
    app.register_blueprint(article_bp)
    # 分类相关路由，处理分类的增删改查等功能
    app.register_blueprint(category_bp)
    # 学习打卡相关路由，处理科目管理、打卡记录、统计查询等功能
    app.register_blueprint(study_bp)
    # 文件上传相关路由，处理图片、文档等文件的上传管理功能
    app.register_blueprint(upload_bp)

    # 初始化数据库
    with app.app_context():
        init_db()

    # 根路由
    @app.route('/')
    def index():
        return success_response({
            'service': '博客API服务',
            'version': '1.0.0',
            'status': 'running'
        }, "服务运行中")

    # 健康检查
    @app.route('/health')
    def health_check():
        return success_response({
            'status': 'healthy',
            'timestamp': None  # 可以添加时间戳
        }, "服务正常运行")

    return app

if __name__ == '__main__':
    app = create_app()
    app.run(debug=True, host='0.0.0.0', port=5000)